package com.atguigu.partition;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

/**
 * @author gmd
 * @desc 分区算子介绍
 * @since 2024-11-25 10:36:46
 */
public class PartitionDemo {

    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
        env.setParallelism(2);

        DataStreamSource<String> socketDS = env.socketTextStream("127.0.0.1", 7777);

        // shuffle 随机分区：将数据随机发送到下游算子的各个并行实例中
        // socketDS.shuffle().print();


        // rebalance 轮询分区：将数据轮询发送到下游算子的各个并行实例中
        // 如果数据源存在数据倾斜问题，可以使用 rebalance 来解决
        // socketDS.rebalance().print();


        // rescale 缩放分区：实现轮询分区，局部组队，比 rebalance 更高效
        // socketDS.rescale().print();


        // broadcast 广播分区：将数据发送给下游所有的子任务
        socketDS.broadcast().print();

        // global 全局分区：将数据全部发送给第一个子任务
        // socketDS.global().print();


        // keyby 按键分区：将数据按指定键发送到下游算子的各个并行实例中
        // socketDS.keyBy().print();


        // 总结：Flink 提供了 7 种分区器 + 1 种自定义分区器
        // 执行 Flink 程序
        env.execute();
    }

}
